import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import router from '@/router'
import { getTimestamp } from './auth'
// 创建一个名为service的axios实例
const service = axios.create({
  // 如果执行 npm run dev  值为 /api 正确  /api 这个代理只是给开发环境配置的代理
  // 如果执行 npm run build 值为 /prod-api  运维应该在上线的时候 给你配置上 /prod-api的代理

  /** *
  * 设置axios请求的基础的基础地址
  * **/
  baseURL: process.env.VUE_APP_BASE_API,

  timeout: 10000 // 定义10秒请求超时时间
})

// axios设置请求拦截器---> 设置请求头token 登录过程6
service.interceptors.request.use(config => {
  // config 是请求的配置信息，必须要return返回
  // config.headers.Authorization = 'Bearer 15642645sdfasdd' //设置请求头
  // 注入token
  if (store.getters.token) {
    // 3客户端设置token是否超时 注入token之前判断token是否失效超时：
    if (Date.now() - getTimestamp() > 7200 * 1000) { // 两个小时
      // 过期 则 调用Vuex里面的actions  先清空token
      store.dispatch('user/logout')
      // 再跳转登录页
      router.push('/login')
      // 返回错误对象给登录
      return Promise.reject(new Error('token失效，请重新登录！'))
    }
    // token未失效超时，才则将token注入请求头
    // config.headers['Authorization'] = `Bearer ${store.getters.token}`
    config.headers.Authorization = `Bearer ${store.getters.token}`
    // 1 服务端响应token失效超时 模拟服务端响应超时
    // config.headers.Authorization = `Bearer 12451524512`
  }
  return config // 必须返回配置
}, err => {
  console.log(err)
  // 返回错误对象
  return Promise.reject(err)
})

// axios设置响应拦截器 结构数据 登录过程7-->在vuex中保存token
service.interceptors.response.use(response => {
  // 拦截处理响应结果，直接返回需要的数据
  // console.log(response)
  const { data: { success, message, data }} = response
  if (!success) {
    // 前端 密码错误等造成的失败
    Message.error(message)
    return Promise.reject(new Error(message))
  }
  // 如果成功，返回响应里面的data
  // console.log(data)
  return data
}, error => {
  console.dir(error)
  // 2 服务端响应token失效超时
  if (error.response && error.response.data.code === 10002) {
    store.dispatch('user/logout')
    router.push('/login')
  }
  // 后端错误500  401...
  Message.error(error.message)
  return Promise.reject(error)
})
export default service
